//守护进程

#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

const char *root = "/";
const char *dev_null = "/dev/null";//不会存数据，给他数据直接给你扔了

//守护进程分五步
void Daemon(bool ischdir,bool isclose)
{
    //1忽略可能引起程序异常退出的信号
    signal(SIGCHLD,SIG_IGN);
    signal(SIGPIPE,SIG_IGN);

    //2.让自己不要成为组长
    //如何不成为组长，组长默认为第一个创建的文件
    //先创建父进程，父进程直接退出，孤儿进程会被系统收养，
    //孤儿进程不可能是组长
    if(fork()>0)
    {
        exit(0);
    }
    //下面代码都是子进程再走
    //3、设置自己成为一个新的会话，
     setsid();
    
    //4.每一个进程都有自己的CWD（路径），是否将当前进程的CWD更改成根目录
    if(ischdir)
    {
        chdir(root);
    }
    
    //5.已经变成守护进程了，不需要和用户 输入，输出，错误 进行关联了
    if(isclose)
    {
        close(0);
        close(1);
        close(2);
    }
    else
    {
        // 这里一般建议就用这种
        int fd = open(dev_null, O_RDWR);
        if (fd > 0)
        {
            dup2(fd, 0);
            dup2(fd, 1);
            dup2(fd, 2);
            close(fd);
        }
    }
     




}